// Package validators 存放自定义规则和验证器

package validators

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
	"unicode/utf8"

	"github.com/thedevsaddam/govalidator"
)

// 初始化执行注册自定义表单验证规则
func init() {

	// max_cn:100 中文长度不超过100
	govalidator.AddCustomRule("max_cn", func(field string, rule string, message string, value interface{}) error {
		valLength := utf8.RuneCountInString(value.(string))
		l, _ := strconv.Atoi(strings.TrimPrefix(rule, "max_cn:"))
		if valLength > l {
			// 如果有自定义消息，则使用自定义消息
			if message != "" {
				return errors.New(message)
			}
			return fmt.Errorf("长度不能超过 %d 个字", l)
		}
		return nil
	})
	// min_val:0.1 最小浮点数为0.1
	govalidator.AddCustomRule("min_val", func(field string, rule string, message string, value interface{}) error {
		minVal := value.(float64)
		val, _ := strconv.ParseFloat(strings.TrimPrefix(rule, "min_val:"), 64)
		if val > minVal {
			// 如果有自定义消息，则使用自定义消息
			if message != "" {
				return errors.New(message)
			}
			return fmt.Errorf("最小订单金额不能低于 %f", val)
		}
		return nil
	})
	// max_val:0.1 最大浮点数为0.1
	govalidator.AddCustomRule("max_val", func(field string, rule string, message string, value interface{}) error {

		maxVal := value.(float64)
		val, _ := strconv.ParseFloat(strings.TrimPrefix(rule, "max_val:"), 64)
		if val < maxVal {
			// 如果有自定义消息，则使用自定义消息
			if message != "" {
				return errors.New(message)
			}
			return fmt.Errorf("最大订单金额不能超过 %f", val)
		}
		return nil
	})
}
